package com.hjk.common.utils.math;


import java.lang.annotation.*;
import java.math.BigDecimal;

/**
 *  设置参数保留位数和保留算法
 * @author junkai.huang
 * @date 2021年10月11日15:23:26
 */
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface SetScale {
    /**
     * 保留位数,默认保留0
     */
    int newScale() default 0;
    /**
     * 1、ROUND_UP(向上取整)：向远离零的方向舍入。
     *         若舍入位为非零，则对舍入部分的前一位数字加1；若舍入位为零，则直接舍弃。即为向外取整模式。
     * 2、ROUND_DOWN (向下取整)：向接近零的方向舍入。
     *         不论舍入位是否为零，都直接舍弃。即为向内取整模式。
     * 3、ROUND_CEILING：向正无穷大的方向舍入。
     *         若 BigDecimal 为正，则舍入行为与 ROUND_UP 相同；若为负，则舍入行为与 ROUND_DOWN 相同。即为向上取整模式。
     * 4、ROUND_FLOOR：向负无穷大的方向舍入。
     *         若 BigDecimal 为正，则舍入行为与 ROUND_DOWN 相同；若为负，则舍入行为与 ROUND_UP 相同。即为向下取整模式。
     * 5、ROUND_HALF_UP(四舍五入)：向“最接近的”整数舍入。
     *         若舍入位大于等于5，则对舍入部分的前一位数字加1；若舍入位小于5，则直接舍弃。即为四舍五入模式。
     * 6、ROUND_HALF_DOWN：向“最接近的”整数舍入。
     *         若舍入位大于5，则对舍入部分的前一位数字加1；若舍入位小于等于5，则直接舍弃。即为五舍六入模式。
     * 7、ROUND_HALF_EVEN：向“最接近的”整数舍入。
     *         若（舍入位大于5）或者（舍入位等于5且前一位为奇数），则对舍入部分的前一位数字加1；
     *         若（舍入位小于5）或者（舍入位等于5且前一位为偶数），则直接舍弃。即为银行家舍入模式。
     * 8、ROUND_UNNECESSARY
     *          断言请求的操作具有精确的结果，因此不需要舍入。
     *         如果对获得精确结果的操作指定此舍入模式，则抛出ArithmeticException。
     *
     *         默认四舍五入
     */
    int roundingMode() default BigDecimal.ROUND_HALF_UP;

    /**
     * 是否格式化百分比,默认false,属性值的类型要求 {@link Object}
     * @return
     */
    boolean percentage() default false;

    /**
     * 精度,默认万
     */
    int precision() default -1;


    /**
     * 精度位数
     */
    interface Precision{
        /**
         * 万
         */
        int TEN_THOUSAND = 10000;
    }


}
